package application;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import modele.Noeud;

import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

import requetes.Evaluation;
import requetes.LancerRequete;
import requetes.ResultatRequete;
import sparql.TraiterOntologie;

import bdd.GetBDD;

public class MainRequetesAuto {

	/**
	 * @param args
	 */
	public static void main(String[] args) {

		GetBDD bdd = GetBDD.getInstance();

		// Le fichier des queries
		File fichierQueries = new File("ressources/Requetes/queries.xml");

		// Lecture du fichier
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		DocumentBuilder docBuilder;
		Document doc;
		try {
			docBuilder = factory.newDocumentBuilder();
			doc = docBuilder.parse(fichierQueries);

			NodeList listQueries = doc.getElementsByTagName("query");

			// Pour chaque query :
			for (int iqQuery = 0; iqQuery < listQueries.getLength(); iqQuery++) {
				Node noeudQuery = listQueries.item(iqQuery);

				// On recupere son id
				NamedNodeMap attributes = noeudQuery.getAttributes();
				String idDansFichier = attributes.getNamedItem("id")
						.getTextContent();

				// Et on en deduit le nom du fichier resultat
				String nomFichierReslt = "ressources/Qrels/qrel"
						+ idDansFichier.substring(1, 3) + ".txt";
				System.out
						.println("\n*******************************************************************************");
				System.out.println("  Execution de la query " + idDansFichier);

				// On recupere le noeud du texte de la query, on recupere ce
				// texte
				NodeList noeudsDansQuery = noeudQuery.getChildNodes();
				String texteQuery = null;
				for (int idNoeud = 0; idNoeud < noeudsDansQuery.getLength(); idNoeud++) {
					Node noeudDansQuery = noeudsDansQuery.item(idNoeud);
					if (noeudDansQuery.getNodeName().equals("text")) {
						texteQuery = noeudDansQuery.getTextContent();
					}
				}
				System.out.println("    Texte requete : " + texteQuery);

				// REQUETE

				ResultatRequete noeudsResultats = null;
				ArrayList<String> resultatsTexte = new ArrayList<String>();

				try {
					if (Parametres.AVEC_ONTOLOGIE) {
						noeudsResultats = TraiterOntologie
								.traiterRequeteParOntologie(texteQuery,
										0);
					} else {
						noeudsResultats = LancerRequete.resultatRequete(
								texteQuery, 0);
					}
					for (Noeud noeud : noeudsResultats.getListeNoeuds()) {
						resultatsTexte
								.add("Collection/"
										+ bdd.recupererDocsFromId(noeud
												.getIdDocument()) + "\t"
										+ noeud.getxPath());
					}

				} catch (Exception e) {
					System.err.println("Echec de la requete");
					return;
				}

				// EVALUATION

				for (int pertinence : Parametres.LISTE_PERTINENCES) {

					ArrayList<String> resultatsTronques = new ArrayList<String>();
					int pertinenceReelle = Integer.MAX_VALUE;
					if (pertinence != 0) {
						pertinenceReelle = pertinence;
					}
					int seuil = Math.min(pertinenceReelle, resultatsTexte.size());
					for (int i = 0; i < seuil; i++) {
						resultatsTronques.add(resultatsTexte.get(i));
					}

					Evaluation eval = ResultatRequete.evaluer(
							resultatsTronques, nomFichierReslt);

					System.out.println("====> Pour une pertinence de " + seuil
							+ " : ");
					System.out.println("Rappel = " + eval.getRappel());
					System.out.println("Precision = " + eval.getPrecision());
				}

			}

		} catch (IOException | SAXException | ParserConfigurationException e) {
			System.err.println("Fichier illisible : "
					+ fichierQueries.getAbsolutePath());
			e.printStackTrace();
		}
		bdd.fermeConnexion();
	}

}
